1

边距重叠

统一的解决方案;设置padding或者border或者触发BFC

边距重叠有一下三种情况:

首先把所有的margin格式清空

<head>
  <title>边距重叠</title>
  <style>
    html *{
      margin-top: 0px;
      padding: 0px;
    }
  </style>
</head>
<body>

1.父子元素之间
块级父元素与第一个或者最后一个子元素(父元素不存在上边框、上内边距、内联元素、清除浮动)。即这个父元素对外展现出来的外边距将直接变成这个父元素和其第一个子元素的margin-top的较大者。父元素的高度:100 或者110 都对.没有overflow: hidden的时候父边距和子边距重叠了,父的高度只有100.加了overflow: hidden,父元素成了新的bfc,就解决了边距重叠的现象,margin-top 没有塌陷进去,所以父的高度是110px;

<section id="parentAndChild">
  <style>
    .parent {
      background-color: red;
      /*overflow: hidden;*/
    }
    .child {
      height: 100px;
      margin-top: 10px;
      background-color: yellow;
    }

  </style>
  <div class="parent">
    <div class="child"></div>
  </div>
</section>

2.相邻兄弟姐妹元素

两个div的边距是50px 而不是90,取了最大值,若为负值,则取绝对值最大的,若一正一负,则取两者的和。
<section >
  <style>
    .left{
      height: 100px;
      margin-bottom: 50px;
      background-color: red;
    }
    .right{
      height:100px;
      background-color: blue;
      margin-top: 40px;
    }
  </style>
  <div class="left"></div>
  <div class="right"></div>
</section>

3.空块元素
如果存在一个空的块级元素, border、 padding、 inline content 、height 、min-height 都不存在,那么上下边距居中将没有任何阻碍,上下边距将合并。取值规则同2一样

<section>
  <p style="margin-bottom: 0px;">这个段落的和下面段落的距离将为20px</p>

  <div style="margin-top: 20px; margin-bottom: 50px;"></div>

  <p style="margin-top: 0px;">这个段落的和上面段落的距离将为20px</p>
</section>

解决方案:BFC讲解

BFC (block formatting context) 块级格式化上下文 =====》是为了解决边距塌陷(边距重叠)问题。

基本概念

BFC (block formatting context) 块级格式化上下文

基本原理

即布局规则
1、每个元素的margin box的左边,与包含块border box 的左边相接触,即使浮动也如此
2、BFC区域不会与float box 重叠
3、BFC是一个隔离的独立的容器,容器里面的子元素的不会影响到外面的元素,反之亦然。
4、计算BFC高度的时候,浮动元素也参与计算。

哪些元素生成BFC

1、overflow: 不为visible
2、postion: absoluted, fixed
3、float 不为none
4、根元素
5、display:inline-block\table-cell\table-caption\flex\inline-flex

应用和解决了什么问题

1、自适应两栏布局

<section>
  <style>
    .left{
      width: 100px;
      float:left;
      height: 100px;
      background-color: yellow;
    }
    .right{
      height: 150px;
      background-color: red;
      overflow: hidden;
    }
  </style>
  <div class="left"></div>
  <div class="right"></div>
</section>

2、清除内部浮动

<section>
  <style>
    .par{
      border:5px solid red;
      width:1000px;
      overflow: hidden;//生成BFC,把浮动元素的高度计算在内,变相地清除了内部浮动
    }
    .child{
      border: 5px solid blue;
      float: left;
      height:100px;
      width: 100px;
    }
  </style>
  <div class="par">
    <div class="child"></div>
    <div class="child"></div>
  </div>
</section>

3、防止边距重叠(BFC中子元素边距重叠)

两个div 中间取了最大值30为重叠了,在p外面包裹一层容器,并触发该容器生成一个
BFC。那么两个P便不属于同一个BFC,就不会发生margin重叠了.
<section>
  <style>
    .wrap{
      overflow: hidden;
    }
    .top{
      height: 100px;
      margin-bottom: 40px;
      background-color: red;
    }
    .bottom{
      height: 100px;
      margin-top: 30px;
      background-color:blue;
    }
  </style>
  <p class="top"></p>
  <div class="wrap">
    <p class="bottom"></p>
  </div>
</section>

总结:因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。


sabrina
6 声望0 粉丝

前端路上奔跑的千里马!